﻿//统一文件为utf-8编码编译
#pragma execution_character_set("utf-8")
///////////////////////////////////////////////////////////////////////////
// 文件名:     heartbeatmanage.h
// 描述:
// 作者:      颜磊
// 创建时间:   2024-06-08 23:42
///////////////////////////////////////////////////////////////////////////
#ifndef HEARTBEATMANAGE_H
#define HEARTBEATMANAGE_H

#include <windows.h>
#include "string"
#include "time.h"
#include <map>
#include <thread>

#pragma comment(lib, "Advapi32.lib")

using namespace std;

#pragma pack(push,1)
struct HeartbeatMsg{
    long long timestamp;
    bool exitFlag; //主动退出标识
    HeartbeatMsg(){
        memset(this,0,sizeof (HeartbeatMsg));
    }
};
#pragma pack(pop)

class SharedMemory
{
public:
    SharedMemory();
    ~SharedMemory();
    HANDLE openSharedMemory(string name,int size);
    bool setSharedMemoryData(string name,char* data,int size);
    bool getSharedMemoryData(string name,char* data,int size);
    void closeSharedMemory(HANDLE hMapFile);

};

class HeartbeatManage
{
public:
    HeartbeatManage();
    ~HeartbeatManage();
    //===================守护服务使用的函数
    /**
     * @brief checkHeartbeat
     * @param name
     * @return 0:校验失败 1:校验成功 2：主动退出
     */
    int checkHeartbeat(string name);//校验心跳

    //===================用户进程使用函数
    void start();//启动心跳线程;
    void stop();//停止心跳线程;
    void beat();//外部自定义线程进行心跳
    void exit();//主动退出，告诉守护无需启动   ！！！主动退出调用！！！
private:
    bool isRun;
    void beatRun();
private:
    string heartbeat_msg;
    SharedMemory sharedMemory;
    map<string,HANDLE> heartbeatMap;
    thread beatThread;
};

#endif // HEARTBEATMANAGE_H
